#ifndef GRAPHSIZES_H_
#define GRAPHSIZES_H_

// IMPORTANTE: VERTICES DEVEM SER INDEXADOS COM LONG

/* Definição de varaiaveis e representação do grafo */
#define MAX_SIZE 1024 //numero maximo de vertices
#define LOG_MAX_SIZE 10
#define SQRT_MAX_SIZE 33


#define BYTE_SIZE ((1+(MAX_SIZE >> LOG_BYTEBITS)) << LOG_MAX_SIZE)

#define BYTEBITS 8
#define LOG_BYTEBITS 3

extern unsigned char bitmapG[];
extern unsigned char addMask[];
extern unsigned char removeMask[];


/*Definição das funções basicas do grafo como macros*/
#define addEdge(i, j) (bitmapG[((i) << (LOG_MAX_SIZE-LOG_BYTEBITS))+((j) >> LOG_BYTEBITS)] |= addMask[(j)%BYTEBITS])//adiciona uma resta
#define removeEdge(i, j) (bitmapG[((i) << (LOG_MAX_SIZE-LOG_BYTEBITS))+((j) >> LOG_BYTEBITS)] &= removeMask[(j)%BYTEBITS])//remove uma aresta
#define hasEdge(i, j) (bitmapG[((i) << (LOG_MAX_SIZE-LOG_BYTEBITS))+((j) >> LOG_BYTEBITS)] & addMask[(j)%BYTEBITS])//verifica a existencia de uma aresta
#define setAllEdges(i) (memset(bitmapG, i, BYTE_SIZE))//adiciona todas as arestas

#endif /*GRAPHSIZES_H_*/
